استكشف أنواع القوالب الحرفية القوية في TypeScript لمعالجة السلاسل النصية المتقدمة ومطابقة الأنماط والتحقق من الصحة. تعلم مع أمثلة عملية وحالات استخدام واقعية.
أنواع القوالب الحرفية: مطابقة الأنماط والتحقق من صحة السلاسل النصية في TypeScript
يتطور نظام أنواع TypeScript باستمرار، مما يمنح المطورين أدوات أكثر قوة للتعبير عن المنطق المعقد وضمان سلامة الأنواع. إحدى الميزات الأكثر إثارة للاهتمام وتنوعًا التي تم تقديمها في الإصدارات الأخيرة هي أنواع القوالب الحرفية. تتيح لك هذه الأنواع معالجة السلاسل النصية على مستوى النوع، مما يتيح مطابقة الأنماط والتحقق من صحة السلاسل النصية المتقدمة. يفتح هذا عالمًا جديدًا تمامًا من الاحتمالات لإنشاء تطبيقات أكثر قوة وقابلة للصيانة.
ما هي أنواع القوالب الحرفية؟
أنواع القوالب الحرفية هي شكل من أشكال النوع الذي يتم إنشاؤه عن طريق الجمع بين أنواع السلاسل النصية الحرفية وأنواع الاتحاد، على غرار طريقة عمل القوالب الحرفية في JavaScript. ومع ذلك، بدلاً من إنشاء سلاسل نصية في وقت التشغيل، فإنها تنشئ أنواعًا جديدة بناءً على الأنواع الموجودة.
إليك مثال أساسي:
type Greeting<T extends string> = `Hello, ${T}!`;
type MyGreeting = Greeting<"World">; // type MyGreeting = "Hello, World!"
في هذا المثال، `Greeting` هو نوع قالب حرفي يأخذ نوع سلسلة نصية `T` كمدخل ويعيد نوعًا جديدًا وهو تسلسل "Hello, ", `T`, و "!".
مطابقة الأنماط الأساسية للسلاسل النصية
يمكن استخدام أنواع القوالب الحرفية لإجراء مطابقة الأنماط الأساسية للسلاسل النصية. يتيح لك هذا إنشاء أنواع صالحة فقط إذا كانت تطابق نمطًا معينًا.
على سبيل المثال، يمكنك إنشاء نوع يقبل فقط السلاسل النصية التي تبدأ بـ "prefix-":
type PrefixedString<T extends string> = T extends `prefix-${string}` ? T : never;
type ValidPrefixedString = PrefixedString<"prefix-valid">; // type ValidPrefixedString = "prefix-valid"
type InvalidPrefixedString = PrefixedString<"invalid">; // type InvalidPrefixedString = never
في هذا المثال، تستخدم `PrefixedString` نوعًا شرطيًا للتحقق مما إذا كانت السلسلة النصية المدخلة `T` تبدأ بـ "prefix-". إذا كان الأمر كذلك، فسيكون النوع هو `T` نفسه؛ وإلا، فسيكون `never`. `never` هو نوع خاص في TypeScript يمثل نوع القيم التي لا تحدث أبدًا، وبالتالي يستبعد السلسلة النصية غير الصالحة.
استخراج أجزاء من سلسلة نصية
يمكن أيضًا استخدام أنواع القوالب الحرفية لاستخراج أجزاء من سلسلة نصية. هذا مفيد بشكل خاص عندما تحتاج إلى تحليل البيانات من السلاسل النصية وتحويلها إلى أنواع مختلفة.
لنفترض أن لديك سلسلة نصية تمثل إحداثيًا بالتنسيق "x:10,y:20". يمكنك استخدام أنواع القوالب الحرفية لاستخراج قيم x و y:
type CoordinateString = `x:${number},y:${number}`;
type ExtractX<T extends CoordinateString> = T extends `x:${infer X},y:${number}` ? X : never;
type ExtractY<T extends CoordinateString> = T extends `x:${number},y:${infer Y}` ? Y : never;
type XValue = ExtractX<"x:10,y:20">; // type XValue = 10
type YValue = ExtractY<"x:10,y:20">; // type YValue = 20
في هذا المثال، تستخدم `ExtractX` و `ExtractY` الكلمة الأساسية `infer` لالتقاط أجزاء السلسلة النصية التي تطابق النوع `number`. `infer` يسمح لك باستخراج نوع من مطابقة الأنماط. ثم يتم استخدام الأنواع التي تم التقاطها كنوع الإرجاع للنوع الشرطي.
التحقق المتقدم من صحة السلاسل النصية
يمكن دمج أنواع القوالب الحرفية مع ميزات TypeScript الأخرى، مثل أنواع الاتحاد والأنواع الشرطية، لإجراء التحقق المتقدم من صحة السلاسل النصية. يتيح لك هذا إنشاء أنواع تفرض قواعد معقدة على بنية ومحتوى السلاسل النصية.
على سبيل المثال، يمكنك إنشاء نوع يتحقق من صحة سلاسل التاريخ بتنسيق ISO 8601:
type Year = `${number}${number}${number}${number}`;
type Month = `0${number}` | `10` | `11` | `12`;
type Day = `${0}${number}` | `${1 | 2}${number}` | `30` | `31`;
type ISODate = `${Year}-${Month}-${Day}`;
type ValidDate = ISODate extends "2023-10-27" ? true : false; // true
type InvalidDate = ISODate extends "2023-13-27" ? true : false; // false
function processDate(date: ISODate) {
// Function logic here. TypeScript enforces the ISODate format.
return `Processing date: ${date}`;
}
console.log(processDate("2024-01-15")); // Works
//console.log(processDate("2024-1-15")); // TypeScript error: Argument of type '"2024-1-15"' is not assignable to parameter of type '`${number}${number}${number}${number}-${0}${number}-${0}${number}` | `${number}${number}${number}${number}-${0}${number}-${1}${number}` | ... 14 more ... | `${number}${number}${number}${number}-12-31`'.
هنا، يتم تعريف `Year` و `Month` و `Day` باستخدام أنواع القوالب الحرفية لتمثيل التنسيقات الصالحة لكل جزء من التاريخ. ثم تجمع `ISODate` هذه الأنواع لإنشاء نوع يمثل سلسلة تاريخ ISO 8601 صالحة. يوضح المثال أيضًا كيف يمكن استخدام هذا النوع لفرض تنسيق البيانات في وظيفة، ومنع تمرير تنسيقات التاريخ غير الصحيحة. هذا يحسن من موثوقية التعليمات البرمجية ويمنع أخطاء وقت التشغيل الناتجة عن الإدخال غير الصالح.
حالات الاستخدام الواقعية
يمكن استخدام أنواع القوالب الحرفية في مجموعة متنوعة من السيناريوهات الواقعية. فيما يلي بعض الأمثلة:
- التحقق من صحة النموذج: يمكنك استخدام أنواع القوالب الحرفية للتحقق من صحة تنسيق مدخلات النموذج، مثل عناوين البريد الإلكتروني وأرقام الهواتف والرموز البريدية.
- التحقق من صحة طلب API: يمكنك استخدام أنواع القوالب الحرفية للتحقق من صحة بنية حمولات طلب API، والتأكد من أنها تتوافق مع التنسيق المتوقع. على سبيل المثال، التحقق من صحة رمز العملة (مثل "USD"، و "EUR"، و "GBP").
- تحليل ملف التكوين: يمكنك استخدام أنواع القوالب الحرفية لتحليل ملفات التكوين واستخراج القيم بناءً على أنماط محددة. ضع في اعتبارك التحقق من صحة مسارات الملفات في كائن التكوين.
- تعدادات مستندة إلى السلاسل النصية: يمكنك إنشاء تعدادات مستندة إلى السلاسل النصية مع التحقق من الصحة باستخدام أنواع القوالب الحرفية.
مثال: التحقق من صحة رموز العملات
دعنا نلقي نظرة على مثال أكثر تفصيلاً للتحقق من صحة رموز العملات. نريد التأكد من أن رموز العملات ISO 4217 الصالحة فقط هي المستخدمة في تطبيقنا. عادة ما تكون هذه الرموز مكونة من ثلاثة أحرف كبيرة.
type CurrencyCode = `${Uppercase<string>}${Uppercase<string>}${Uppercase<string>}`;
function formatCurrency(amount: number, currency: CurrencyCode) {
// Function logic to format currency based on the provided code.
return `$${amount} ${currency}`;
}
console.log(formatCurrency(100, "USD")); // Works
//console.log(formatCurrency(100, "usd")); // TypeScript error: Argument of type '"usd"' is not assignable to parameter of type '`${Uppercase}${Uppercase}${Uppercase}`'.
//More precise example:
type ValidCurrencyCode = "USD" | "EUR" | "GBP" | "JPY" | "CAD" | "AUD"; // Extend as needed
type StronglyTypedCurrencyCode = ValidCurrencyCode;
function formatCurrencyStronglyTyped(amount: number, currency: StronglyTypedCurrencyCode) {
return `$${amount} ${currency}`;
}
console.log(formatCurrencyStronglyTyped(100, "EUR")); // Works
//console.log(formatCurrencyStronglyTyped(100, "CNY")); // TypeScript error: Argument of type '"CNY"' is not assignable to parameter of type '"USD" | "EUR" | "GBP" | "JPY" | "CAD" | "AUD"'.
يوضح هذا المثال كيفية إنشاء نوع `CurrencyCode` يقبل فقط السلاسل النصية المكونة من ثلاثة أحرف كبيرة. يوضح المثال الثاني، الأكثر كتابة بقوة، كيفية تقييد هذا بشكل أكبر إلى قائمة محددة مسبقًا من العملات المقبولة.
مثال: التحقق من صحة مسارات نقطة نهاية API
حالة استخدام أخرى هي التحقق من صحة مسارات نقطة نهاية API. يمكنك تحديد نوع يمثل بنية نقطة نهاية API صالحة، مما يضمن إجراء الطلبات إلى المسارات الصحيحة. هذا مفيد بشكل خاص في بنيات الخدمات الصغيرة حيث قد تعرض خدمات متعددة واجهات برمجة تطبيقات مختلفة.
type APIServiceName = "users" | "products" | "orders";
type APIEndpointPath = `/${APIServiceName}/${string}`;
function callAPI(path: APIEndpointPath) {
// API call logic
console.log(`Calling API: ${path}`);
}
callAPI("/users/123"); // Valid
callAPI("/products/details"); // Valid
//callAPI("/invalid/path"); // TypeScript error
// Even more specific:
type APIAction = "create" | "read" | "update" | "delete";
type APIEndpointPathSpecific = `/${APIServiceName}/${APIAction}`;
function callAPISpecific(path: APIEndpointPathSpecific) {
// API call logic
console.log(`Calling specific API: ${path}`);
}
callAPISpecific("/users/create"); // Valid
//callAPISpecific("/users/list"); // TypeScript error
يتيح لك ذلك تحديد بنية نقاط نهاية API بشكل أكثر دقة، ومنع الأخطاء المطبعية وضمان الاتساق عبر تطبيقك. هذا مثال أساسي؛ يمكن إنشاء أنماط أكثر تعقيدًا للتحقق من صحة معلمات الاستعلام وأجزاء أخرى من عنوان URL.
فوائد استخدام أنواع القوالب الحرفية
يوفر استخدام أنواع القوالب الحرفية لمطابقة الأنماط والتحقق من صحة السلاسل النصية العديد من الفوائد:
- تحسين سلامة الأنواع: تتيح لك أنواع القوالب الحرفية فرض قيود أكثر صرامة على أنواع السلاسل النصية، مما يقلل من خطر أخطاء وقت التشغيل.
- تحسين إمكانية قراءة التعليمات البرمجية: تجعل أنواع القوالب الحرفية التعليمات البرمجية الخاصة بك أكثر قابلية للقراءة من خلال التعبير بوضوح عن التنسيق المتوقع للسلاسل النصية.
- زيادة قابلية الصيانة: تجعل أنواع القوالب الحرفية التعليمات البرمجية الخاصة بك أكثر قابلية للصيانة من خلال توفير مصدر واحد للحقيقة لقواعد التحقق من صحة السلاسل النصية.
- تجربة مطور أفضل: توفر أنواع القوالب الحرفية إكمال تلقائي ورسائل خطأ أفضل، مما يحسن تجربة المطور بشكل عام.
القيود
في حين أن أنواع القوالب الحرفية قوية، إلا أنها تحتوي أيضًا على بعض القيود:
- التعقيد: يمكن أن تصبح أنواع القوالب الحرفية معقدة، خاصة عند التعامل مع الأنماط المعقدة. من الضروري تحقيق التوازن بين فوائد سلامة الأنواع وقابلية صيانة التعليمات البرمجية.
- الأداء: يمكن أن تؤثر أنواع القوالب الحرفية على أداء التحويل البرمجي، خاصة في المشاريع الكبيرة. هذا لأن TypeScript تحتاج إلى إجراء فحص أكثر تعقيدًا للنوع.
- دعم محدود للتعبيرات النمطية: في حين أن أنواع القوالب الحرفية تسمح بمطابقة الأنماط، إلا أنها لا تدعم النطاق الكامل لميزات التعبير النمطي. للتحقق من صحة السلاسل النصية المعقدة للغاية، قد تظل التعبيرات النمطية في وقت التشغيل مطلوبة جنبًا إلى جنب مع تركيبات النوع هذه لتحقيق تنظيف الإدخال المناسب.
أفضل الممارسات
فيما يلي بعض أفضل الممارسات التي يجب وضعها في الاعتبار عند استخدام أنواع القوالب الحرفية:
- ابدأ ببساطة: ابدأ بأنماط بسيطة وزد التعقيد تدريجيًا حسب الحاجة.
- استخدم أسماء وصفية: استخدم أسماء وصفية لأنواع القوالب الحرفية الخاصة بك لتحسين إمكانية قراءة التعليمات البرمجية.
- وثق أنواعك: وثق أنواع القوالب الحرفية الخاصة بك لشرح الغرض منها واستخدامها.
- اختبر بدقة: اختبر أنواع القوالب الحرفية الخاصة بك بدقة للتأكد من أنها تتصرف على النحو المتوقع.
- ضع في اعتبارك الأداء: كن على دراية بتأثير أنواع القوالب الحرفية على أداء التحويل البرمجي وقم بتحسين التعليمات البرمجية الخاصة بك وفقًا لذلك.
الخلاصة
أنواع القوالب الحرفية هي ميزة قوية في TypeScript تتيح لك إجراء معالجة السلاسل النصية المتقدمة ومطابقة الأنماط والتحقق من الصحة على مستوى النوع. باستخدام أنواع القوالب الحرفية، يمكنك إنشاء تطبيقات أكثر قوة وقابلية للصيانة وأمانًا من حيث الأنواع. على الرغم من وجود بعض القيود، إلا أن فوائد استخدام أنواع القوالب الحرفية غالبًا ما تفوق العيوب، مما يجعلها أداة قيمة في ترسانة أي مطور TypeScript. مع استمرار تطور لغة TypeScript، سيكون فهم واستخدام ميزات النوع المتقدمة هذه أمرًا بالغ الأهمية لبناء برامج عالية الجودة. تذكر تحقيق التوازن بين التعقيد وإمكانية القراءة وإعطاء الأولوية دائمًا للاختبار الشامل.